#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const string P = "4931";
const int M = 4;

// KMP 辅助
int lps[M];
int nextState[M+1][10];

// 存所有 <= r 且包含 "4931" 的数
vector<ll> valid;
ll R;

// 预处理 lps 和 nextState
void buildAutomaton(){
    // 构 lps
    lps[0] = 0;
    for(int i = 1, len = 0; i < M; ){
        if(P[i] == P[len]) lps[i++] = ++len;
        else if(len) len = lps[len-1];
        else lps[i++] = 0;
    }
    // 构 nextState
    for(int s = 0; s <= M; ++s){
        for(int d = 0; d < 10; ++d){
            if(s < M && d == P[s]-'0'){
                nextState[s][d] = s+1;
            } else if(s == 0){
                nextState[s][d] = 0;
            } else {
                nextState[s][d] = nextState[lps[s-1]][d];
            }
            // 如果已经是“匹配完成”状态，就进入吸收态 M
            if(s == M) nextState[s][d] = M;
        }
    }
}

// DFS 枚举
// cur: 当前已构造的数字； state: 已匹配到 P 的前缀长度（0..M）；
// 注意：一旦 state == M，就说明 cur 本身就含 "4931"
void dfs(ll cur, int state){
    if(cur > R) return;
    if(state == M){
        valid.push_back(cur);
        // 注意：匹配完成后，我们依然要继续往下枚举更长的数字，
        // 因为 14931x 这些数字也都是合法的
    }
    // 继续往更高位扩展
    for(int d = 0; d <= 9; ++d){
        // 避免生成前导 0
        if(cur == 0 && d == 0) continue;
        ll nxt = cur*10 + d;
        if(nxt > R) break;  // 排序意义上，越往后越大，提前剪枝
        int ns = nextState[state][d];
        dfs(nxt, ns);
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    ll L;
    cin >> L >> R;

    buildAutomaton();
    // 从空数字开始 DFS（cur=0），先选首位 d=1..9
    dfs(0, 0);

    // 把所有找到的数排序去重（可能会有重复路径生成相同数）
    sort(valid.begin(), valid.end());
    valid.erase(unique(valid.begin(), valid.end()), valid.end());

    // 遍历区间 [L, R]，累加
    ll ans = 0;
    for(ll x : valid){
        if(x < L) continue;
        if(x > R) break;
        ans += x;
    }
    cout << ans << "\n";
    return 0;
}
